package com.itheima.arithmetic.queue;

/**
 * 链表方式实现队列
 */
public class LinkedQueue {

    // 头节点数据
    private ListNode head;

    // 尾节点
    private ListNode tail;

    // 链表大小
    private int num = 0;

    // 链表最大的可容量(防止无限动态申请内存空间)
    private int maxSize = 20;

    // 入队(单向顺序队列一般从链表尾部插入)
    private void push(int data) {

        // 空间没满才能入队
        if (++num <= maxSize) {

            ListNode newNode = new ListNode(data);
            if (num == 1) {
                // 只有一个节点
                head = tail = newNode;
            } else {
                // 尾节点指向新的节点
                tail.next = newNode;
                tail = newNode;
            }
        }

    }

    // 出队(单向顺序队列一般从头出队)
    private int pop() {
        if (isEmpty()) {
            return -1;
        }
        // 取出头数据
        int value = head.value;

        // 头指针后移一位(下一个是新的头结点)
        head = head.next;

        num--;
        return value;
    }

    // 遍历链表
    private void print(){
        ListNode current = head;
        for (int i = 0; i < num; i++) {
            System.out.println("打印:" + current.value);
            current = current.next;
        }
    }

    private boolean isEmpty() {
        return num == 0;
    }


    public static void main(String[] args) {
        LinkedQueue linkedQueue = new LinkedQueue();
        linkedQueue.push(30);
//        linkedQueue.push(40);
//        linkedQueue.push(50);
        linkedQueue.print();

        int pop1 = linkedQueue.pop();
        System.out.println("取出的链表头数据:" + pop1 + "还剩:" + linkedQueue.num);
        linkedQueue.print();

        int pop2 = linkedQueue.pop();
        System.out.println("取出的链表头数据:" + pop2 + "还剩:" + linkedQueue.num);
        linkedQueue.print();

        int pop3 = linkedQueue.pop();
        System.out.println("取出的链表头数据:" + pop3 + "还剩:" + linkedQueue.num);
    }
}

 class ListNode {
     // 节点数据
     int value;

     // 下一个节点指针
     ListNode next;

     public ListNode(int value) {
         this.value = value;
     }
 }

